import random

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

from celery_tasks.sms.tasks import send_sms_code
from meiduo_mall.utils.DBHelper import create_redis_conn
from verifications import constants

# 创建redis数据库连接
conn = create_redis_conn("sms_code")

class SMSCodeView(APIView):
    def get(self, request, mobile):
        """
        校验改用户是否在一分钟内进行了多次请求
        生产验证码
        将验证码存入redis数据库中 键的形式为sms_code_% % mobile
        注意：从redis数据库中取出的数据为二进制
        (使用redis的管道，减少对数据库的连接数)
        使用第三方接口进行发送
        (使用celery异步发送短信)
        :param request: 
        :param mobile: 用户手机号
        :return: 
        """
        # 校验该用户是否在一分钟内多次请求
        flag = conn.get("send_flag_%s" % mobile)
        if flag:
            return Response({"message": "请在60秒后重试"}, status=status.HTTP_503_SERVICE_UNAVAILABLE)

        sms_code = "%06d" % random.randint(0, 999999)
        print(sms_code)
        # 创建redis的管道
        pl = conn.pipeline()
        pl.setex("sms_code_%s" % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
        pl.setex("send_flag_%s" % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
        pl.execute()

        # 发送短信验证码
        sms_code_expires = constants.SMS_CODE_REDIS_EXPIRES // 60
        # 使用celery进行异步短信发送
        send_sms_code(mobile, sms_code, sms_code_expires)
        # try:
        #     ccp = CCP()
        #     res = ccp.send_template_sms(mobile, [sms_code, sms_code_expires], constants.SMS_CODE_TEMP_ID)
        # except Exception as e:
        #     return Response({"message": "发送短信异常"}, status=status.HTTP_503_SERVICE_UNAVAILABLE)

        # if res != 0:
        #     return Response({"message": "发送短信失败"}, status=status.HTTP_503_SERVICE_UNAVAILABLE)

        return Response({"message": "OK"})
